package com.miku.blog.service;

import com.miku.blog.domain.Article;
import com.baomidou.mybatisplus.extension.service.IService;
import com.miku.blog.domain.param.ReceptionParam;
import com.miku.blog.domain.pojo.ResponseResult;
import com.miku.blog.domain.vo.ArticleEditVo;
import org.springframework.lang.Nullable;

import java.util.List;

/**
* @author Miku
* @description 针对表【tb_article】的数据库操作Service
* @createDate 2022-05-26 17:52:39
*/
public interface ArticleService extends IService<Article> {


    /**
     * 保存文章
     * @param articleEditVo
     * @return
     */
    ResponseResult saveArticle(ArticleEditVo articleEditVo);


    /**
     * 编辑文章
     * @param articleId
     * @return
     */
    ResponseResult editArticle(Integer articleId);

    /**
     * 删除指定文章列表 { 非真正删除 ，只是将状态修改为删除状态 }
     * @return
     */
    ResponseResult deleteArticleByLogic(ReceptionParam receptionParam);

    /**
     * 删除指定文章列表 { 物理上删除 (真正删除) }
     * @param articleIdList
     * @return
     */
    ResponseResult deleteArticle(Integer[] articleIdList);


    /**
     * 文章是否置顶   (根据文章ID)
     * @return
     */
    ResponseResult top(Article article);

    /**
     * 分页查询文章列表
     * @param current 当前页码
     * @param size 每页显示个数
     * @param keywords 搜索内容
     * @param isDelete 是否已删除
     * @param status  公开  /   私密  /  草稿
     * @param type 类型
     * @param categoryId  分类ID
     * @param tagId 标签ID
     * @return
     */
    ResponseResult articles(Integer current,
                            Integer size,
                            String keywords,
                            Integer isDelete,
                            Integer status,
                            Integer type,
                            Integer categoryId,
                            Integer tagId);

    /**
     * 按类别分组 获取 文章列表
     * @return
     */
    List<Article> getArticleListByGroupByCategoryId();

    /**
     * 根据类别ID 获取 文章列表  {也可同时获取 草稿 或 已删除文章}
     *
     * 为NULL 时  获取所有类型文章
     * @param categoryId
     * @return
     */
    List<Article> getArticleListByCategory(Integer categoryId, Integer status,Integer isDelete);

    /**
     * 后台管理系统
     *
     * 分类管理 : 根据类别ID 获取 文章数量 {不获取已删除 或 草稿 的文章数量}
     * @param categoryId
     * @return
     */
    long getArticleCountByCategoryId(Integer categoryId);

    /**
     * 前台博客 分类导航 ：根据类别ID 获取对应分类下有多少篇文章)
     *
     * 根据判断当前用户是否为管理员，选择展示 私有的 文章数量，
     * 若非管理员则一律只展示 公开的 文章数量
     *
     * @param categoryId
     * @return
     */
    long getArticleCountByCategory(Integer categoryId);


    /**
     * 根据创建时间 获取 文章列表  { 已发布的 }
     * @param article
     * @return
     */
    List<Article>  getArticleListByCreateTime(Article article);

    /**
     * 获取前10篇 阅读量最高的文章
     * 根据阅读量从高到低排序
     * @return
     */
    List<Article> getArticleList();


    //    /**
//     * 根据文章标题 获取 文章列表
//     * @param article
//     * @return
//     */
//    List<Article> getArticleListByArticleTitle(Article article);


    /**
     * 前台 首页 /
     *
     * 获取文章列表，
     *
     * 根据判断当前用户是否为管理员，选择展示 私有 文章
     * 若非管理员，则一律只展示 公开 文章
     *
     * @param current
     * @return
     */
    ResponseResult getArticles(Integer current);


    /**
     * 获取文章详情
     * 及 其文章上下篇章
     * 与 推荐文章 (根据分类推荐) 、 最新文章
     *
     * 根据判断当前用户是否为管理员，选择展示 私有 文章
     * 若非管理员，则一律只展示 公开 文章
     *
     * @param articleId
     * @return
     */
    ResponseResult getArticleDetail(Integer articleId);

    /**
     * 搜索文章内容 或 标题
     * （优先标题 ，若标题为搜索为0,则搜索文章内容）
     *
     * 根据判断当前用户是否为管理员，选择展示 私有 文章
     * 若非管理员，则一律只展示 公开 文章
     *
     * @param current
     * @param keywords
     * @return
     */
    ResponseResult searchArticle(Integer current, String keywords);


    /**
     * 分页 获取文章档案
     *
     * 根据判断当前用户是否为管理员，选择展示 私有 文章
     * 若非管理员，则一律只展示 公开 文章
     *
     * @param current
     * @return
     */
    ResponseResult getArticleArchives(Integer current);

    /**
     * 根据分类ID 或  根据标签ID 获取文章列表  展示
     *
     * 根据判断当前用户是否为管理员，选择展示 私有 文章
     * 若非管理员，则一律只展示 公开 文章
     *
     * @param categoryId
     * @param tagId
     * @param current
     * @return
     */
    ResponseResult getArticlesByCategory(Integer categoryId,Integer tagId, Integer current);


    /**
     * 获取所有未删除的文章
     *
     * 用于在项目启动时，向redis缓存文章阅读量
     *
     * @return
     */
    List<Article> getAllArticleList();

    /**
     * 根据文章ID 更新阅读量 / 点赞量
     *
     * 用于定时任务，定时更新文章阅读量
     *
     * @param articleId
     * @param viewCount
     * @return
     */
    boolean updateArticleViewCount(Integer articleId, @Nullable Integer viewCount);


    /**
     * 前台博客
     *
     * 获取 博客文章数量 { 非删除 及 非草稿 }
     *
     * 根据判断当前用户是否为管理员，选择展示 私有的 文章数量
     * 若非管理员，则一律只展示 公开的 文章数量
     *
     * @return
     */
    long getArticleCount();
}
